/*******************************************************************************
* Имя файла: typeConversion
* Дата: 31-03-2024
* Разработчик: Андрей Подлегаев
* На основе кода: Dr. Moritz Lehmann,
* theoretical physicist at the University of Bayreuth
* Группа: 315
* Факультет: ЦДО ТУСУР
* Лицензия: BSD
* Описание: Решение задач к лабораторной работе №4 (ЦДО ТУСУР)
* *****************************************************************************/

#include "colorTextConsole.h"

std::string getTextcolorCode(const int textcolor)
{
  switch(textcolor) {
    case  0: return "30"; // color_black      0
    case  1: return "34"; // color_dark_blue  1
    case  2: return "32"; // color_dark_green 2
    case  3: return "36"; // color_light_blue 3
    case  4: return "31"; // color_dark_red   4
    case  5: return "35"; // color_magenta    5
    case  6: return "33"; // color_orange     6
    case  7: return "37"; // color_light_gray 7
    case  8: return "90"; // color_gray       8
    case  9: return "94"; // color_blue       9
    case 10: return "92"; // color_green     10
    case 11: return "96"; // color_cyan      11
    case 12: return "91"; // color_red       12
    case 13: return "95"; // color_pink      13
    case 14: return "93"; // color_yellow    14
    case 15: return "97"; // color_white     15
    default: return "37";
    }
}
std::string getBackgroundcolorCode(const int backgroundcolor)
{
  switch(backgroundcolor) {
    case  0: return  "40"; // color_black      0
    case  1: return  "44"; // color_dark_blue  1
    case  2: return  "42"; // color_dark_green 2
    case  3: return  "46"; // color_light_blue 3
    case  4: return  "41"; // color_dark_red   4
    case  5: return  "45"; // color_magenta    5
    case  6: return  "43"; // color_orange     6
    case  7: return  "47"; // color_light_gray 7
    case  8: return "100"; // color_gray       8
    case  9: return "104"; // color_blue       9
    case 10: return "102"; // color_green     10
    case 11: return "106"; // color_cyan      11
    case 12: return "101"; // color_red       12
    case 13: return "105"; // color_pink      13
    case 14: return "103"; // color_yellow    14
    case 15: return "107"; // color_white     15
    default: return  "40";
    }
}
std::string getPrintColor(const int textcolor)
{
  return "\033[" + getTextcolorCode(textcolor) + "m";
}

std::string getPrintColor(const int textcolor, const int backgroundcolor)
{
  return "\033[" + getTextcolorCode(textcolor) + ";" + getBackgroundcolorCode(backgroundcolor) + "m";
}

void printColor(const int textcolor) {
#if defined(_WIN32)
  static const HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
  SetConsoleTextAttribute(handle, textcolor);
#elif defined(__linux__)
  std::cout << getPrintColor(textcolor);
#endif // Windows/Linux
}

void printColor(const int textcolor, const int backgroundcolor)
{
#if defined(_WIN32)
  static const HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
  SetConsoleTextAttribute(handle, backgroundcolor<<4|textcolor);
#elif defined(__linux__)
  std::cout << getPrintColor(textcolor, backgroundcolor);
#endif // Windows/Linux
}

void printColorReset()
{
#if defined(_WIN32)
  static const HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
  SetConsoleTextAttribute(handle, 7); // reset color
#elif defined(__linux__)
  std::cout << "\033[0m"; // reset color
#endif // Windows/Linux
}

void println(const std::string& s)
{
  std::cout << s << std::endl;
}

void print(const std::string& s)
{
  std::cout << s;
}

void print(const std::string& s, const int textcolor)
{
  printColor(textcolor);
  // Времменый корректив
  std::cout << std::setw(3) << std::right << s;
  //std::cout << s;
  printColorReset();
}

void print(const std::string& s, const int textcolor, const int backgroundcolor)
{
  printColor(textcolor, backgroundcolor);
  std::cout << s;
  printColorReset();
}

void printNoReset(const std::string& s, const int textcolor)
{
  printColor(textcolor);
  std::cout << s;
}

void printNoReset(const std::string& s, const int textcolor, const int backgroundcolor)
{
  printColor(textcolor, backgroundcolor);
  std::cout << s;
}
